Point-in-time copies of application data are often maintained in order to provide fault tolerance within a system. For example, businesses typically create backup copies of user data on a regular basis. If user data is later lost (e.g., due to a user accidentally deleting a file or due to the failure of a storage device), the lost data can be restored from the backup copy. In order to provide consistency, copies of application data are created in such a way that the copies represent the value of the application data at a particular point in time.
It is desirable to create new point-in-time copies of application data at rather frequent intervals. If, for example, backups are only performed every night at midnight, a file that was created at 1 PM and accidentally deleted at 3 PM of the same day will not be present on any backup. If an additional point-in-time copy of the application data is created daily at 2 PM, however, a version of the lost file could be recovered from the copy created at 2 PM. Techniques such as those used to generate snapshots are often used to create point-in-time copies of application data at frequent intervals. These techniques tend to be less disruptive to users than conventional backup techniques.
One drawback to creating copies of application data more frequently is that there is likely to be a large number of point-in-time copies of the application in existence at the same time. Each point-in-time copy is likely to require a large amount of storage space, and thus the cost of maintaining these point-in-time copies may quickly become prohibitive.
Additionally, point-in-time copies are typically maintained as logical block devices (e.g., each snapshot of a block device can be maintained as a separate volume). Management of these devices can be complex. Thus, the utilities required to create and maintain point-in-time copies can involve a significant amount of overhead that is devoted to creating and maintaining the block devices that store the point-in-time copies. This can increase the price and/or reliability of the utilities that create and maintain point-in-time copies.
As the above examples show, existing techniques for creating and maintaining point-in-time copies of data stored in block devices may consume undesirably large amounts of storage and/or be undesirably complex. Accordingly, new techniques that reduce the amount of storage needed to store point-in-time images and/or that decrease the complexity involved in managing such point-in-time images are desired.